#include "Config.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

// 静态成员初始化
Config *Config::s_instance = nullptr;
QMutex Config::s_mutex;

Config::Config(QObject *parent)
    : QObject(parent), m_initialized(false)
{
}

Config::~Config()
{
}

// 获取单例实例
Config *Config::instance()
{
    if (s_instance == nullptr)
    {
        QMutexLocker locker(&s_mutex);
        if (s_instance == nullptr)
        {
            s_instance = new Config();
        }
    }
    return s_instance;
}

// 初始化配置
bool Config::initialize()
{
    if (m_initialized)
    {
        qWarning() << "配置管理器已初始化";
        return true;
    }

    // 检查数据库是否已初始化
    DatabaseService *dbService = DatabaseService::instance();
    if (!dbService->isInitialized())
    {
        qCritical() << "配置管理器初始化失败：数据库未初始化";
        return false;
    }

    m_initialized = true;
    qInfo() << "✅ 配置管理器初始化完成";
    return true;
}

// 通用读取方法 参数：key: 配置项名称, defaultValue: 默认值
// 返回：配置项值
QVariant Config::getValue(const QString &key, const QVariant &defaultValue)
{
    if (!m_initialized)
    {
        qWarning() << "配置管理器未初始化，返回默认值";
        return defaultValue;
    }

    QSqlDatabase db = DatabaseService::instance()->database();
    QSqlQuery query(db);
    query.prepare("SELECT config_value, config_type FROM system_config WHERE config_key = ?");
    query.addBindValue(key);

    if (!query.exec())
    {
        qWarning() << "读取配置失败:" << key << query.lastError().text();
        return defaultValue;
    }

    if (query.next())
    {
        QString value = query.value(0).toString();
        QString type = query.value(1).toString();

        // 根据类型转换
        if (type == "int")
            return value.toInt();
        else if (type == "float")
            return value.toDouble();
        else if (type == "bool")
            return (value == "1" || value.toLower() == "true");
        else
            return value;
    }

    return defaultValue;
}

// 通用写入方法
bool Config::setValue(const QString &key, const QVariant &value, const QString &type)
{
    if (!m_initialized)
    {
        qWarning() << "配置管理器未初始化";
        return false;
    }

    QSqlDatabase db = DatabaseService::instance()->database();
    QSqlQuery query(db);

    // 使用 INSERT OR REPLACE 语法（SQLite 特性）
    query.prepare(R"(
        INSERT OR REPLACE INTO system_config (config_key, config_value, config_type, updated_at) 
        VALUES (?, ?, ?, datetime('now', 'localtime'))
    )");
    query.addBindValue(key);
    query.addBindValue(value.toString());
    query.addBindValue(type);

    if (!query.exec())
    {
        qWarning() << "写入配置失败:" << key << query.lastError().text();
        return false;
    }

    emit configChanged(key, value);
    return true;
}

// 读取字符串配置
QString Config::getString(const QString &key, const QString &defaultValue)
{
    return getValue(key, defaultValue).toString();
}

// 读取整数配置
int Config::getInt(const QString &key, int defaultValue)
{
    return getValue(key, defaultValue).toInt();
}

// 读取浮点数配置
double Config::getDouble(const QString &key, double defaultValue)
{
    return getValue(key, defaultValue).toDouble();
}

// 读取布尔配置
bool Config::getBool(const QString &key, bool defaultValue)
{
    return getValue(key, defaultValue).toBool();
}

// 写入字符串配置
bool Config::setString(const QString &key, const QString &value)
{
    return setValue(key, value, "string");
}

// 写入整数配置
bool Config::setInt(const QString &key, int value)
{
    return setValue(key, value, "int");
}

// 写入浮点数配置
bool Config::setDouble(const QString &key, double value)
{
    return setValue(key, value, "float");
}

// 写入布尔配置
bool Config::setBool(const QString &key, bool value)
{
    return setValue(key, value ? "1" : "0", "bool");
}

// 检查配置项是否存在
bool Config::hasKey(const QString &key)
{
    if (!m_initialized)
        return false;

    QSqlDatabase db = DatabaseService::instance()->database();
    QSqlQuery query(db);
    query.prepare("SELECT COUNT(*) FROM system_config WHERE config_key = ?");
    query.addBindValue(key);

    if (query.exec() && query.next())
    {
        return query.value(0).toInt() > 0;
    }

    return false;
}

// 删除配置项
bool Config::removeKey(const QString &key)
{
    if (!m_initialized)
        return false;

    QSqlDatabase db = DatabaseService::instance()->database();
    QSqlQuery query(db);
    query.prepare("DELETE FROM system_config WHERE config_key = ?");
    query.addBindValue(key);

    if (!query.exec())
    {
        qWarning() << "删除配置失败:" << key << query.lastError().text();
        return false;
    }

    return true;
}

// 获取所有配置项
QMap<QString, QString> Config::getAllConfig()
{
    QMap<QString, QString> configMap;

    if (!m_initialized)
        return configMap;

    QSqlDatabase db = DatabaseService::instance()->database();
    QSqlQuery query(db);
    query.exec("SELECT config_key, config_value FROM system_config");

    while (query.next())
    {
        configMap[query.value(0).toString()] = query.value(1).toString();
    }

    return configMap;
}
